using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.Events;

/*
 *知识点
 *1.Dictionary 字典   List 列表 -> Queue 队列
 *2.GameObject 和 Resources 两个公共类中的 API
 */

/// <summary>
/// 缓存池模块
/// </summary>
public class 缓存池管理器 : 单例_基础管理器<缓存池管理器>
{
    /// <summary>
    /// 嵌套类 用于整理容器节点
    /// </summary>
    private class 缓存容器
    {
        public Queue<GameObject> 队列;
        public Transform 容器;

        public int 队列长度 { get => 队列.Count; }
        public 缓存容器(GameObject obj,Transform 父级)    
        {
            队列 = new Queue<GameObject>();
            容器 = new GameObject(obj.name).transform;
            容器.parent = 父级;
            添加物品(obj);
        }

        public void 添加物品(GameObject obj)
        {
            obj.SetActive(false);
            队列.Enqueue(obj);
            obj.transform.parent = 容器;
        }
        public GameObject 获取物品()
        {
            GameObject obj = 队列.Dequeue();
            obj.SetActive(true);
            obj.transform.parent = null;
            return obj;
        }
    }


    Transform 父级;
    public 缓存池管理器()
    {
        父级 = new GameObject("缓存池管理器").transform;
    }

    private Dictionary<string, 缓存容器> 缓存池 = new Dictionary<string, 缓存容器>();

    /// <summary>
    /// 往外拿东西
    /// </summary>
    /// <param name="name">东西名称</param>
    /// <returns>GameObject</returns>
    public void 获取对象(string name, UnityAction<GameObject> 回调函数)
    {
        if (缓存池.ContainsKey(name) && 缓存池[name].队列长度 > 0)
            回调函数(缓存池[name].获取物品());
        else
        {
            资源管理器.获取实例.加载_异步<GameObject>(name, (o) =>
            {
                o.name = name;
                回调函数(o);
            });
        }
    }

    /// <summary>
    /// 暂时不用的东西 添加进去
    /// </summary>
    /// <param name="name">东西名称</param>
    /// <param name="obj"></param>
    public void 添加对象(string name, GameObject obj)
    {
        if (缓存池.ContainsKey(name))
            缓存池[name].添加物品(obj); 
        else
            缓存池.Add(name, new 缓存容器(obj,父级));
    }

    /// <summary>
    /// 清空缓存池的方法,主要用于场景切换时
    /// </summary>
    public void 清空缓存池()
    {
        缓存池.Clear();
        父级 = new GameObject("缓存池管理器").transform;
    }

}


